"""
Python基础学习 - 数据结构示例代码
=============================

本文件展示了Python中常用的数据结构及其基本操作：
1. 列表 (List) - 有序、可变的元素集合
2. 字典 (Dictionary) - 键值对的集合
3. 集合 (Set) - 不重复元素的无序集合
4. 元组 (Tuple) - 有序、不可变的元素集合

这些数据结构是Python编程的基础，掌握它们对于编写高效的Python程序至关重要。
"""

# 1. 列表示例
# 列表是Python中最常用的数据结构之一，用方括号[]表示
# 列表中的元素可以是不同类型，且可以随时添加、删除或修改
def list_demo():
    print("=== 列表示例 ===")
    
    # 创建列表 - 使用方括号[]，元素之间用逗号分隔
    fruits = ['apple', 'banana', 'orange']
    print(f"初始列表: {fruits}")
    
    # append()方法 - 在列表末尾添加一个元素
    fruits.append('grape')
    print(f"添加元素后: {fruits}")
    
    # insert()方法 - 在指定位置插入元素
    # 语法：列表.insert(位置索引, 元素)
    # 注意：索引从0开始，insert(1, 'kiwi')表示在第二个位置插入
    fruits.insert(1, 'kiwi')
    print(f"插入元素后: {fruits}")
    # remove()方法 - 删除列表中第一个匹配的元素
    # 如果要删除的元素不存在，会报错
    fruits.remove('banana')
    print(f"删除元素后: {fruits}")
    
    # 列表切片 - 获取列表的一部分
    # 语法：列表[起始索引:结束索引]
    # 注意：结束索引不包含在结果中
    print(f"前两个元素: {fruits[:2]}")
    
    # 列表推导式 - 一种简洁的创建列表的方法
    # 语法：[表达式 for 变量 in 可迭代对象 if 条件]
    # 这里将每个水果名称转换为大写
    upper_fruits = [fruit.upper() for fruit in fruits]
    print(f"大写水果名: {upper_fruits}")

# 2. 字典示例
# 字典是键值对的集合，用花括号{}表示
# 字典中的键必须是唯一的，且通常是字符串类型
# 字典中的值可以是任意类型，包括列表、字典等
def dict_demo():
    print("\n=== 字典示例 ===")
    
    # 创建字典 - 使用花括号{}，键值对之间用逗号分隔，键和值之间用冒号分隔
    student = {
        'name': '张三',           # 姓名：字符串类型
        'age': 20,               # 年龄：整数类型
        'major': '计算机科学',     # 专业：字符串类型
        'grades': [85, 92, 78]   # 成绩：列表类型
    }
    print(f"学生信息: {student}")
    
    # 访问字典中的值 - 通过键来获取对应的值
    print(f"学生姓名: {student['name']}")
    
    # 添加新的键值对 - 直接赋值给新键
    student['graduation_year'] = 2025
    print(f"添加毕业年份后: {student}")
    
    # 更新已有的值 - 直接赋值给已存在的键
    student['age'] = 21
    print(f"更新年龄后: {student}")
    
    # 字典推导式 - 类似于列表推导式，用于创建字典
    # 这里创建一个字典，键是数字，值是该数字的平方
    squares = {x: x**2 for x in range(1, 6)}
    print(f"平方字典: {squares}")

# 3. 集合示例
# 集合是一个无序且不重复的元素集合，用花括号{}或set()函数创建
# 集合支持数学上的集合运算，如交集、并集、差集等
def set_demo():
    print("\n=== 集合示例 ===")
    
    # 创建集合 - 使用花括号{}，元素之间用逗号分隔
    # 注意：集合中的元素是唯一的，重复的元素会被自动去除
    set1 = {1, 2, 3, 4, 5}
    set2 = {4, 5, 6, 7, 8}
    print(f"集合1: {set1}")
    print(f"集合2: {set2}")
    
    # 集合运算
    # & 运算符表示交集 - 同时存在于两个集合中的元素
    print(f"交集: {set1 & set2}")
    # | 运算符表示并集 - 至少存在于一个集合中的元素
    print(f"并集: {set1 | set2}")
    # - 运算符表示差集 - 只存在于第一个集合中的元素
    print(f"差集: {set1 - set2}")
    
    # add()方法 - 向集合中添加一个元素
    # 如果元素已存在，则不会有任何变化
    set1.add(6)
    print(f"添加元素后: {set1}")
    
    # discard()方法 - 从集合中移除一个元素
    # 如果元素不存在，不会报错
    set1.discard(1)
    print(f"删除元素后: {set1}")

# 4. 元组示例
# 元组是有序且不可变的元素序列，用圆括号()表示
# 元组一旦创建就不能修改，适用于存储不变的数据
def tuple_demo():
    print("\n=== 元组示例 ===")
    
    # 创建元组 - 使用圆括号()，元素之间用逗号分隔
    coordinates = (10, 20)      # 坐标点
    rgb_color = (255, 128, 0)   # RGB颜色值
    print(f"坐标: {coordinates}")
    print(f"RGB颜色: {rgb_color}")
    
    # 元组解包 - 将元组中的元素分别赋值给多个变量
    # 这是一种非常方便的赋值方式
    x, y = coordinates
    print(f"解包后的坐标: x={x}, y={y}")
    
    # 命名元组示例 - collections.namedtuple提供了一种更清晰的元组使用方式
    # 命名元组可以像类一样通过属性名访问元素，但比类更轻量
    from collections import namedtuple
    # 创建一个名为Point的命名元组类型，它有两个字段：x和y
    Point = namedtuple('Point', ['x', 'y'])
    # 创建Point类型的实例
    p = Point(15, 25)
    # 通过属性名访问元素，比通过索引访问更清晰
    print(f"命名元组: {p}, x={p.x}, y={p.y}")

# 主函数 - 程序的入口点
# 当直接运行这个Python文件时，会执行main()函数
# 如果这个文件被其他文件导入，则不会自动执行main()函数
def main():
    # 按顺序执行各个演示函数
    list_demo()
    dict_demo()
    set_demo()
    tuple_demo()

# 这是一个Python的特殊机制
# 当直接运行这个文件时（而不是导入它），
# __name__变量的值会是"__main__"，从而执行main()函数
if __name__ == "__main__":
    main()